#ifndef TCPSERVERSINGLETON_H
#define TCPSERVERSINGLETON_H

#include <QLine>
#include <QDebug>
#include <QObject>
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostInfo> // 主机信息类
#include <QHostAddress> // IP地址类
#include <QNetworkInterface>

// 创建单例模式的TCP服务器
// 1. 构造函数设置为private, 使得其不能通过普通方式构造
// 2. 要使其所有的对象是同一个,
//  创建一个内部静态指针, 指向一个特定的对象
// 3. 额外提供专门的函数, 用于创建
//    自定义, 且是静态函数, 如果当前没有, 用new创建并返回
//                 如果有, 则返回现有的对象
// 使用
// 其他数据可以按照普通数据来设置(不需要是静态)
// 销毁
// 类的析构函数也设置为private, 用于屏蔽
// 并且提供专门的销毁函数

class tcpServerSingleton : public QObject
{
    Q_OBJECT

public:
    // 数据: 必须有一个public+static的指针
    // 用来永远指向一个固定的对象, 给用户使用
    static tcpServerSingleton *tcpServer;

    // 额外提供的普通函数, 给用户用来生成
    // 必须是static, 使得可以无对象时调用
    static tcpServerSingleton *create_tcpServer();
    static tcpServerSingleton *create_tcpServer(const QString &ip, int port = 10000);

    // 额外提供的普通函数, 给用户用来销毁
    // 必须时static, 使其无对象也可以调用
    static void destroy_tcpServer();

    // 普通函数
    const QTcpServer *get_server() const;
    const QTcpSocket *get_socket() const;

    const QString &get_listen_ip() const;
    void set_listen_ip(const QString &ip);

    int get_listen_port() const;
    void set_listen_port(int port);

    const QString &get_client_ip();
    const QString &get_client_port();

    void show() const;

signals:
    void sig_recv(QString recv);

private:
    tcpServerSingleton(QWidget *parent = nullptr);
    tcpServerSingleton(const QString &ip, int port = 10000, QWidget *parent = nullptr);
    ~tcpServerSingleton();

    QTcpServer *server;
    QTcpSocket *server_socket;

    QString listen_ip;
    int listen_port;
    QString client_ip;
    QString client_port;

public slots:
    void slot_newConnection();
    void slot_socket_readyRead();
    void slot_socket_disconnected();
    void slot_send_data(const QString &send);
};

#endif // TCPSERVERSINGLETON_H
